cmake_minimum_required(VERSION 3.12)
project(MyCpp20Project LANGUAGES CXX)

# 设置 C++20 标准
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)  # 禁用 GNU 扩展，使用标准 C++

# 如果使用 GCC，检查编译器版本是否支持 C++20
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0)
        message(WARNING "GCC版本 ${CMAKE_CXX_COMPILER_VERSION} 对C++20支持不完整，建议使用GCC 10或更高版本")
    endif()
endif()

# 查找系统库
find_package(Threads REQUIRED)  # 用于多线程支持

# 添加可执行文件
add_executable(${PROJECT_NAME}
    src/main.cpp
    # 添加其他源文件...
)

# 包含目录
target_include_directories(${PROJECT_NAME} PRIVATE
    include
    # 添加其他包含目录...
)

# 编译选项
target_compile_options(${PROJECT_NAME} PRIVATE
    -Wall
    -Wextra
    -Wpedantic
    # 添加其他编译选项...
)

# 链接库 - 添加各种类型的链接项
target_link_libraries(${PROJECT_NAME} PRIVATE
    # 1. 系统库
    Threads::Threads  # 多线程支持
    # pthread  # 如果上面Threads找不到，可以直接链接pthread（Linux）

    # 2. 标准库组件（通常不需要显式链接，但某些特殊组件可能需要）
    # dl  # 动态加载库（如使用dlopen）
    # m   # 数学库

    # 3. 第三方库（示例）
    # Boost::filesystem  # 如果使用Boost文件系统
    # OpenSSL::SSL       # 如果使用OpenSSL
    # fmt::fmt           # 如果使用fmt库进行格式化

    # 4. 自定义库
    # my_custom_lib      # 如果项目中有其他自定义库
)

# 如果项目包含子目录（如库目录）
# add_subdirectory(libs/mylib)
# target_link_libraries(${PROJECT_NAME} PRIVATE mylib)

# 安装目标（可选）
# install(TARGETS ${PROJECT_NAME} DESTINATION bin)

# 查找并链接第三方库的示例（以fmt为例）
# find_package(fmt REQUIRED)
# target_link_libraries(${PROJECT_NAME} PRIVATE fmt::fmt)

# 使用pkg-config查找库的示例（如gtkmm）
# find_package(PkgConfig REQUIRED)
# pkg_check_modules(GTKMM REQUIRED gtkmm-3.0)
# target_include_directories(${PROJECT_NAME} PRIVATE ${GTKMM_INCLUDE_DIRS})
# target_link_libraries(${PROJECT_NAME} PRIVATE ${GTKMM_LIBRARIES})